Skip to Content
πŸŽ‰ Welcome to JS World!!! πŸŽ‰

12μž₯ ν•¨μˆ˜

12.1 ν•¨μˆ˜λž€?

  • μˆ˜ν•™μ˜ ν•¨μˆ˜λŠ” β€œμž…λ ₯”을 λ°›μ•„ β€œμΆœλ ₯”을 λ‚΄λ³΄λ‚΄λŠ” 일련의 과정을 μ •μ˜ν•œ 것이닀.
  • ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ˜ ν•¨μˆ˜λ„ μˆ˜ν•™μ˜ ν•¨μˆ˜μ™€ 같은 κ°œλ…μ΄λ‹€.
  • ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ˜ ν•¨μˆ˜λŠ” 일련의 과정을 λ¬Έ(statement)으둜 κ΅¬ν˜„ν•˜κ³  μ½”λ“œ λΈ”λ‘μœΌλ‘œ κ°μ‹Έμ„œ ν•˜λ‚˜μ˜ μ‹€ν–‰ λ‹¨μœ„λ‘œ μ •μ˜ν•œ 것이닀.
Note
  • λ§€κ°œλ³€μˆ˜ : ν•¨μˆ˜ λ‚΄λΆ€λ‘œ μž…λ ₯을 μ „λ‹¬λ°›λŠ” λ³€μˆ˜
  • 인수 : μž…λ ₯
  • λ°˜ν™˜κ°’ : 좜λ ₯
  • ν•¨μˆ˜λŠ” ν•¨μˆ˜ μ •μ˜λ₯Ό 톡해 μƒμ„±ν•œλ‹€.
  • ν•¨μˆ˜ μ •μ˜λ§ŒμœΌλ‘œ ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜λŠ” 것은 μ•„λ‹ˆλ‹€.
  • 인수λ₯Ό λ§€κ°œλ³€μˆ˜λ₯Ό 톡해 ν•¨μˆ˜μ— μ „λ‹¬ν•˜λ©΄μ„œ ν•¨μˆ˜μ˜ 싀행을 λͺ…μ‹œμ μœΌλ‘œ μ§€μ‹œν•΄μ•Ό ν•˜κ³ , 이λ₯Ό ν•¨μˆ˜ 호좜이라고 ν•œλ‹€.

12.2 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 이유

  • ν•¨μˆ˜λŠ” λͺ‡ λ²ˆμ΄λ“  ν˜ΈμΆœν•  수 μžˆμœΌλ―€λ‘œ μ½”λ“œμ˜ μž¬μ‚¬μš©μ΄λΌλŠ” μΈ‘λ©΄μ—μ„œ 맀우 μœ μš©ν•˜λ‹€.
  • 같은 μ½”λ“œλ₯Ό μ€‘λ³΅ν•΄μ„œ μ—¬λŸ¬ 번 μž‘μ„±ν•˜λ©΄ μ½”λ“œ μˆ˜μ •μ— κ±Έλ¦¬λŠ” μ‹œκ°„λ„ μ¦κ°€ν•˜κ³ , 휴먼 μ—λŸ¬μ˜ λ°œμƒ κ°€λŠ₯성도 높아진닀.
  • ν•¨μˆ˜μ˜ μ‚¬μš©μ€ μ½”λ“œ 쀑볡을 μ–΅μ œν•˜λ―€λ‘œ μœ μ§€λ³΄μˆ˜μ˜ νŽΈμ˜μ„±μ„ 높이고 μ‹€μˆ˜λ₯Ό 쀄여 μ½”λ“œμ˜ 신뒰성을 λ†’μ΄λŠ” νš¨κ³Όκ°€ μžˆλ‹€.
  • μ μ ˆν•œ ν•¨μˆ˜ 이름은 λ‚΄λΆ€ μ½”λ“œλ₯Ό μ΄ν•΄ν•˜μ§€ μ•Šκ³ λ„ ν•¨μˆ˜μ˜ 역할을 νŒŒμ•…ν•  수 있고, μ΄λŠ” μ½”λ“œμ˜ 가독성을 ν–₯μƒμ‹œν‚¨λ‹€.
πŸ’‘
Tip
  • μ½”λ“œμ˜ μž¬μ‚¬μš©
  • μœ μ§€λ³΄μˆ˜μ˜ νŽΈμ˜μ„±
  • μ½”λ“œμ˜ μ‹ λ’°μ„±
  • μ½”λ“œμ˜ 가독성

12.3 ν•¨μˆ˜ λ¦¬ν„°λŸ΄

  • μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν•¨μˆ˜λŠ” 객체 νƒ€μž…μ˜ 값이닀.

[!note] > ν•¨μˆ˜ λ¦¬ν„°λŸ΄μ˜ ꡬ성 μš”μ†Œ

  • ν•¨μˆ˜ 이름
    • ν•¨μˆ˜ 이름은 μ‹λ³„μžμ΄λ―€λ‘œ 넀이밍 κ·œμΉ™μ„ μ€€μˆ˜ν•΄μ•Ό ν•œλ‹€.
    • ν•¨μˆ˜ 이름은 ν•¨μˆ˜ λͺΈμ²΄ λ‚΄μ—μ„œλ§Œ μ°Έμ‘°ν•  수 μžˆλŠ” μ‹λ³„μžλ‹€.
    • ν•¨μˆ˜ 이름은 μƒλž΅ κ°€λŠ₯ν•˜λ‹€. (읡λͺ… ν•¨μˆ˜)
  • λ§€κ°œλ³€μˆ˜ λͺ©λ‘
    • λ§€κ°œλ³€μˆ˜ λͺ©λ‘μ€ μˆœμ„œμ— μ˜λ―Έκ°€ μžˆλ‹€.
    • λ§€κ°œλ³€μˆ˜λŠ” ν•¨μˆ˜ λͺΈμ²΄ λ‚΄μ—μ„œ λ³€μˆ˜μ™€ λ™μΌν•˜κ²Œ μ·¨κΈ‰, 넀이밍 κ·œμΉ™μ„ μ€€μˆ˜ν•΄μ•Όν•œλ‹€.
  • ν•¨μˆ˜ λͺΈμ²΄
    • ν•¨μˆ˜ λͺΈμ²΄λŠ” ν•¨μˆ˜ ν˜ΈμΆœμ— μ˜ν•΄ μ‹€ν–‰λœλ‹€.
Note
  • λ¦¬ν„°λŸ΄μ€ 값을 μƒμ„±ν•˜κΈ° μœ„ν•œ ν‘œκΈ°λ²•μ΄λ‹€.
  • ν•¨μˆ˜λ¦¬ν„°λŸ΄λ„ ν‰κ°€λ˜μ–΄ 값을 μƒμ„±ν•˜λ©°, 이 값은 객체닀.
  • 즉, ν•¨μˆ˜λŠ” 객체닀.
  • 일반 κ°μ²΄λŠ” ν˜ΈμΆœν•  수 μ—†μ§€λ§Œ ν•¨μˆ˜λŠ” ν˜ΈμΆœν•  수 μžˆλ‹€.
  • ν•¨μˆ˜ κ°μ²΄λŠ” 일반 κ°μ²΄μ—λŠ” μ—†λŠ” κ³ μœ ν•œ ν”„λ‘œνΌν‹°λ₯Ό κ°–λŠ”λ‹€. (prototype, length, name, arguments 등등…)

12.4 ν•¨μˆ˜ μ •μ˜

  • ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜λŠ” 방법은 4가지가 μžˆλ‹€.
  • ν•¨μˆ˜ 선언문이 ν‰κ°€λ˜λ©΄ μ‹λ³„μžκ°€ μ•”λ¬΅μ μœΌλ‘œ μƒμ„±λ˜κ³  ν•¨μˆ˜ 객체가 ν• λ‹Ήλœλ‹€.
  • λ³€μˆ˜λŠ” μ„ μ–Έ, ν•¨μˆ˜λŠ” μ •μ˜

12.4.1 ν•¨μˆ˜ μ„ μ–Έλ¬Έ

  • ν•¨μˆ˜ 선언문은 ν•¨μˆ˜ λ¦¬ν„°λŸ΄κ³Ό ν˜•νƒœκ°€ λ™μΌν•˜λ‹€.
  • 단, ν•¨μˆ˜ λ¦¬ν„°λŸ΄μ€ ν•¨μˆ˜ 이름을 μƒλž΅ν•  수 μžˆμœΌλ‚˜ ν•¨μˆ˜ 선언문은 ν•¨μˆ˜ 이름을 μƒλž΅ν•  수 μ—†λ‹€.
  • ν•¨μˆ˜ 선언문은 ν‘œν˜„μ‹μ΄ μ•„λ‹Œ 문이닀.
  • 즉, κ°’μœΌλ‘œ ν‰κ°€λ˜μ§€ μ•ŠμœΌλ―€λ‘œ λ³€μˆ˜μ— ν• λ‹Ήν•  수 μ—†λ‹€.
var add = function add(x, y) { return x + y; };

Q. μ—₯ μœ„ μ½”λ“œ 보면 ν•¨μˆ˜ μ„ μ–Έλ¬Έ λ³€μˆ˜μ— ν• λ‹Ήν•˜κ³  μžˆλŠ”κ±° μ•„λ‹Œκ°€μš” A. λ˜‘κ°™μ΄ μƒκ²Όμ§€λ§Œ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μœ„λ₯Ό ν•¨μˆ˜ 선언문이 μ•„λ‹Œ ν•¨μˆ˜ λ¦¬ν„°λŸ΄ ν‘œν˜„μ‹μœΌλ‘œ ν•΄μ„ν•œλ‹€.

  • { } λŠ” 블둝문일 μˆ˜λ„ 있고, 객체 λ¦¬ν„°λŸ΄μΌ μˆ˜λ„ μžˆλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 λ¬Έλ§₯에 따라 ν•΄μ„ν•œλ‹€.
  • κΈ°λͺ… ν•¨μˆ˜ λ¦¬ν„°λŸ΄λ„ ν•¨μˆ˜ 선언문일 μˆ˜λ„ 있고, ν•¨μˆ˜ λ¦¬ν„°λŸ΄ ν‘œν˜„μ‹μΌ μˆ˜λ„ μžˆλ‹€. λ¬Έλ§₯에 따라 ν•΄μ„λœλ‹€. (값이 λ˜μ–΄μ•Ό ν•˜λŠ” μžλ¦¬μ—μ„œλŠ” ν‘œν˜„μ‹, μ•„λ‹Œ 곳에선 μ„ μ–Έλ¬Έ)
function foo() { console.log("foo"); } foo()( // foo function bar() { console.log("bar"); } ); bar(); // ReferenceError: bar is not defined
  • μœ„λŠ” ν•¨μˆ˜ 선언문이고, μ•„λž˜λŠ” ν•¨μˆ˜ λ¦¬ν„°λŸ΄ ν‘œν˜„μ‹μ΄λ‹€.

Q. μ—₯ λ˜‘κ°™μ΄ μƒκ²ΌλŠ”λ° μ•„λž˜λŠ” μ™œ ν•¨μˆ˜ λ¦¬ν„°λŸ΄ ν‘œν˜„μ‹μΈκ°€μš” A. ( ) λŠ” κ·Έλ£Ή μ—°μ‚°μžμ΄κ³ , μ•ˆμͺ½μ€ ν‘œν˜„μ‹(κ°’)의 μžλ¦¬μ΄λ‹€. λ”°λΌμ„œ μ•„λž˜μͺ½μ€ ν•¨μˆ˜ λ¦¬ν„°λŸ΄ ν‘œν˜„μ‹μ΄λ‹€.

  • μ•žμ„œ ν•¨μˆ˜ λ¦¬ν„°λŸ΄μ—μ„œ μ‚΄νŽ΄λ΄€λ“―μ΄, ν•¨μˆ˜ 이름은 ν•¨μˆ˜ λͺΈμ²΄ λ‚΄μ—μ„œλ§Œ μ°Έμ‘°ν•  수 μžˆλŠ” μ‹λ³„μžμ΄λ‹€.

Q. μ—₯ 그럼 λ³€μˆ˜μ— ν• λ‹Ήν•˜μ§€ μ•ŠλŠ” 이상 ν•¨μˆ˜ 호좜 λͺ»ν•˜λ‚˜μš” A. ν•¨μˆ˜ 선언문을 μ΄μš©ν•˜λ©΄ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 μ•”λ¬΅μ μœΌλ‘œ ν•¨μˆ˜ 이름과 같은 μ‹λ³„μžλ₯Ό μƒμ„±ν•˜κ³  ν•¨μˆ˜ 객체λ₯Ό ν• λ‹Ήν•΄μ€€λ‹€.

  • λ”°λΌμ„œ ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ μ„ μ–Έν•œ μœ„μͺ½ ν•¨μˆ˜(foo)λŠ” 호좜이 κ°€λŠ₯ν–ˆμ§€λ§Œ, ν•¨μˆ˜ λ¦¬ν„°λŸ΄ ν‘œν˜„μ‹μœΌλ‘œ μ„ μ–Έν•œ μ•„λž˜μͺ½(bar)ν•¨μˆ˜λŠ” ν•¨μˆ˜λ₯Ό κ°€λ¦¬ν‚€λŠ” μ‹λ³„μžκ°€ μ—†μ–΄ ReferenceErrorλ₯Ό 보인닀.
  • μœ„ λ‚΄μš©μ„ 보면 μ•Œκ² μ§€λ§Œ, ν•¨μˆ˜ ν˜ΈμΆœμ€ ν•¨μˆ˜ μ΄λ¦„μœΌλ‘œ ν˜ΈμΆœν•˜λŠ” 것이 μ•„λ‹ˆλΌ ν•¨μˆ˜ 객체λ₯Ό κ°€λ¦¬ν‚€λŠ” μ‹λ³„μžλ‘œ ν˜ΈμΆœν•œλ‹€.
  • ν•¨μˆ˜ 이름과 λ³€μˆ˜ 이름이 κ°™μ•„ ν•¨μˆ˜ μ΄λ¦„μœΌλ‘œ ν˜ΈμΆœλ˜λŠ” λ“―ν•˜μ§€λ§Œ 사싀은 μ‹λ³„μžλ‘œ 호좜된 것이닀.
πŸ’‘
Tip
  • 결둠적으둜 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 ν•¨μˆ˜ 선언문을 ν•¨μˆ˜ ν‘œν˜„μ‹μœΌλ‘œ λ³€ν™˜ν•΄ ν•¨μˆ˜ 객체λ₯Ό μƒμ„±ν•œλ‹€κ³  생각할 수 μžˆλ‹€.
  • 단 μ •ν™•νžˆ λ™μΌν•˜κ²Œ λ™μž‘ν•˜λŠ” 것은 μ•„λ‹ˆλ‹€.

12.4.2 ν•¨μˆ˜ ν‘œν˜„μ‹

var add = function (x, y) { return x + y; }; console.log(add(2, 5)); // μ‹λ³„μžλ‘œ 호좜! μ—¬κΈ°μ„  ν•¨μˆ˜ 이름은 μ‘΄μž¬ν•˜μ§€λ„ μ•ŠλŠ”λ‹€. (읡λͺ… ν•¨μˆ˜)
  • ν•¨μˆ˜λŠ” 객체닀.
  • μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν•¨μˆ˜λŠ” κ°’μ²˜λŸΌ λ³€μˆ˜μ— ν• λ‹Ήν•  μˆ˜λ„ 있고 ν”„λ‘œνΌν‹° 값이 될 μˆ˜λ„ 있으며 λ°°μ—΄μ˜ μš”μ†Œκ°€ 될 μˆ˜λ„ μžˆλ‹€.
  • 이처럼 κ°’μ˜ μ„±μ§ˆμ„ κ°–λŠ” 객체λ₯Ό 일급 객체라 ν•˜κ³ , μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν•¨μˆ˜λŠ” 일급 객체이닀.
  • ν•¨μˆ˜κ°€ 일급 객체(κ°’)μ΄λΌλŠ” 것은 ν•¨μˆ˜ λ¦¬ν„°λŸ΄λ‘œ μƒμ„±ν•œ ν•¨μˆ˜ 객체λ₯Ό λ³€μˆ˜μ— ν• λ‹Ήν•  수 μžˆλ‹€λŠ” 것이닀.
  • μ΄λŸ¬ν•œ ν•¨μˆ˜ μ •μ˜ 방식을 ν•¨μˆ˜ ν‘œν˜„μ‹μ΄λΌ ν•œλ‹€.
  • ν•¨μˆ˜ ν‘œν˜„μ‹μ˜ ν•¨μˆ˜ 이름은 μƒλž΅ν•  수 μžˆλ‹€. (μ–΄μ°¨ν”Ό κ°’μœΌλ‘œ 평가돼 λ³€μˆ˜μ— ν• λ‹Ήλ˜λ―€λ‘œ)
  • ν•¨μˆ˜ 선언문은 κ°’μœΌλ‘œ ν‰κ°€λ˜μ§€ μ•Šμ•„ λ³€μˆ˜μ— ν• λ‹Ήν•  수 μ—†μ—ˆμœΌλ―€λ‘œ ν•¨μˆ˜ 이름을 μƒλž΅ν•  수 μ—†μ—ˆλ‹€. (ν•¨μˆ˜ 이름을 μž‘μ„±ν•΄μ•Όλ§Œ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 κ·Έκ±Έ 보고 μ•”λ¬΅μ μœΌλ‘œ μ‹λ³„μž 생성 ν›„ 할당해쀄 수 μžˆμœΌλ―€λ‘œ)

12.4.3 ν•¨μˆ˜ 생성 μ‹œμ κ³Ό ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…

// ν•¨μˆ˜ μ°Έμ‘° console.dir(add); // f add(x, y) console.dir(sub); // undefined // ν•¨μˆ˜ν˜ΈμΆœ console.log(add(2, 5); // 7 console.log(sub(2, 5); // TypeError: sub is not a function // ν•¨μˆ˜ μ„ μ–Έλ¬Έ function add(x, y) { return x + y; } //ν•¨μˆ˜ ν‘œν˜„μ‹ var sub = function (x, y) { return x - y; };
  • ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ μ •μ˜ν•œ ν•¨μˆ˜λŠ” ν•¨μˆ˜ μ„ μ–Έλ¬Έ 이전에 ν˜ΈμΆœν•  수 μžˆλ‹€.

  • ν•¨μˆ˜ ν‘œν˜„μ‹μœΌλ‘œ μ •μ˜ν•œ ν•¨μˆ˜λŠ” ν•¨μˆ˜ ν‘œν˜„μ‹ 이전에 ν˜ΈμΆœν•  수 μ—†λ‹€.

  • λͺ¨λ“  선언문이 κ·Έλ ‡λ“― ν•¨μˆ˜ 선언문도 λŸ°νƒ€μž„ 이전에 λ¬Έλ§₯ ν˜•μ„±(μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ)을 μœ„ν•΄ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ λ¨Όμ € 싀행돼 ν•¨μˆ˜ 객체가 μƒμ„±λ˜κ³ , μ•”λ¬΅μ μœΌλ‘œ μƒμ„±λœ μ‹λ³„μžμ— ν• λ‹Ήλœλ‹€.

  • 즉 λŸ°νƒ€μž„μ—” 이미 ν•¨μˆ˜ 객체가 μƒμ„±λ˜κ³  μ‹λ³„μžμ— ν• λ‹ΉκΉŒμ§€ μ™„λ£Œλœ μƒνƒœμ΄λ―€λ‘œ ν•¨μˆ˜ μ„ μ–Έλ¬Έ 이전에 ν•¨μˆ˜λ₯Ό μ°Έμ‘°ν•˜κ±°λ‚˜ ν˜ΈμΆœν•  μˆ˜λ„ μžˆλ‹€.

  • 이처럼 ν•¨μˆ˜ 선언문이 μ½”λ“œμ˜ μ„ λ‘λ‘œ λŒμ–΄ μ˜¬λ €μ§„ κ²ƒμ²˜λŸΌ μžλ°”μŠ€ν¬λ¦½νŠΈ 고유의 νŠΉμ§•μ„ ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ…μ΄λΌ ν•œλ‹€.

    [!note] > ν•¨μˆ˜ ν˜Έμ΄μŠ€νŒ… vs λ³€μˆ˜ ν˜Έμ΄μŠ€νŒ…

    • λŸ°νƒ€μž„ 이전에 λ¬Έλ§₯ ν˜•μ„±μ„ μœ„ν•΄ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 λ¨Όμ € μ‹€ν–‰ν•΄ μ‹λ³„μžλ₯Ό μƒμ„±ν•œλ‹€λŠ” μ μ—μ„œλŠ” 동일
    • λ³€μˆ˜λŠ” λ¨Όμ € undefined둜 μ΄ˆκΈ°ν™”λ˜κ³ , 이후 λŸ°νƒ€μž„μ—μ„œ κ°’ ν• λ‹Ή
    • ν•¨μˆ˜λŠ” ν•¨μˆ˜ 객체 생성 및 암묡적 μ‹λ³„μžλ‘œ ν• λ‹ΉκΉŒμ§€ 마침
  • ν•¨μˆ˜ ν‘œν˜„μ‹μ€ λ³€μˆ˜μ— ν• λ‹Ήλ˜λŠ” 값이 ν•¨μˆ˜ λ¦¬ν„°λŸ΄μΈ 문이닀.

  • λ”°λΌμ„œ λŸ°νƒ€μž„μ— ν‰κ°€λ˜κΈ° μ „κΉŒμ§€λŠ” undefined둜 μ΄ˆκΈ°ν™” λ˜μ–΄μžˆκ³ , ν•¨μˆ˜ ν‘œν˜„μ‹ 이전에 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ TypeErrorκ°€ λ°œμƒν•œλ‹€.

  • ν•¨μˆ˜ ν‘œν˜„μ‹μœΌλ‘œ μ •μ˜ν•œ ν•¨μˆ˜λŠ” λ°˜λ“œμ‹œ ν•¨μˆ˜ ν‘œν˜„μ‹ 이후에 μ°Έμ‘° λ˜λŠ” ν˜ΈμΆœν•΄μ•Ό ν•œλ‹€.

12.4.4 Function μƒμ„±μž ν•¨μˆ˜

var add = new Function("x", "y", "return x + y");
  • 객체λ₯Ό μƒμ„±ν•˜λŠ” ν•¨μˆ˜μΈ μƒμ„±μž ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜λ©΄ ν•¨μˆ˜ 객체λ₯Ό 생성할 수 μžˆλ‹€.
  • ν•˜μ§€λ§Œ μ΄λ ‡κ²Œ μƒμ„±ν•œ ν•¨μˆ˜λŠ” ν΄λ‘œμ €λ₯Ό μƒμ„±ν•˜μ§€ μ•ŠλŠ” λ“± ν•¨μˆ˜ μ„ μ–Έλ¬Έμ΄λ‚˜ ν•¨μˆ˜ ν‘œν˜„μ‹μœΌλ‘œ μƒμ„±ν•œ ν•¨μˆ˜μ™€ λ‹€λ₯΄κ²Œ λ™μž‘ν•œλ‹€.
  • λ”°λΌμ„œ μ΄λ ‡κ²Œ ν•¨μˆ˜λ₯Ό μƒμ„±ν•˜λŠ” 방식은 μΌλ°˜μ μ΄μ§€λ„ μ•Šκ³  λ°”λžŒμ§ν•˜μ§€λ„ μ•Šλ‹€.

12.4.5 ν™”μ‚΄ν‘œ ν•¨μˆ˜

const add = (x, y) => x + y;
  • ES6μ—μ„œ λ„μž…λœ ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” function ν‚€μ›Œλ“œ λŒ€μ‹  ν™”μ‚΄ν‘œ => λ₯Ό μ‚¬μš©ν•΄ κ°„λž΅ν•œ λ°©λ²•μœΌλ‘œ ν•¨μˆ˜λ₯Ό μ„ μ–Έν•  수 μžˆλ‹€.
  • ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” 항상 읡λͺ… ν•¨μˆ˜λ‘œ μ •μ˜ν•œλ‹€.
  • ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” λ‚΄λΆ€ λ™μž‘ λ˜ν•œ κ°„λž΅ν™” λ˜μ–΄ μžˆλ‹€.
  • μžμ„Έν•œ 건 λ‚˜μ€‘μ— μ‚΄νŽ΄λ³΄μž.^^

12.5 ν•¨μˆ˜ 호좜

12.5.1 λ§€κ°œλ³€μˆ˜μ™€ 인수

  • ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ 값을 μ™ΈλΆ€μ—μ„œ ν•¨μˆ˜ λ‚΄λΆ€λ‘œ 전달할 ν•„μš”κ°€ μžˆλŠ” 경우, λ§€κ°œλ³€μˆ˜(인자)λ₯Ό 톡해 인수λ₯Ό μ „λ‹¬ν•œλ‹€.
  • μΈμˆ˜λŠ” κ°’μœΌλ‘œ 평가될 수 μžˆλŠ” ν‘œν˜„μ‹μ΄μ–΄μ•Ό ν•œλ‹€.
  • ν•¨μˆ˜κ°€ 호좜되면 ν•¨μˆ˜ λͺΈμ²΄ λ‚΄μ—μ„œ μ•”λ¬΅μ μœΌλ‘œ λ§€κ°œλ³€μˆ˜κ°€ μƒμ„±λ˜κ³  일반 λ³€μˆ˜μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ undefined둜 μ΄ˆκΈ°ν™”λœ 이후 μΈμˆ˜κ°€ μˆœμ„œλŒ€λ‘œ ν• λ‹Ήλœλ‹€.
  • λ§€κ°œλ³€μˆ˜μ˜ μŠ€μ½”ν”„(μœ νš¨λ²”μœ„)λŠ” ν•¨μˆ˜ λ‚΄λΆ€λ‹€.
function add(x, y) { return x + y; } console.log(add(2)); //NaN
  • ν•¨μˆ˜λŠ” λ§€κ°œλ³€μˆ˜μ˜ κ°œμˆ˜μ™€ 인수의 κ°œμˆ˜κ°€ μΌμΉ˜ν•˜λŠ”μ§€ μ²΄ν¬ν•˜μ§€ μ•ŠλŠ”λ‹€. (μ—λŸ¬ λ°œμƒ X)
  • μΈμˆ˜κ°€ λΆ€μ‘±ν•΄μ„œ μΈμˆ˜κ°€ ν• λ‹Ήλ˜μ§€ μ•Šμ€ λ§€κ°œλ³€μˆ˜μ˜ 값은 undefined이닀.
  • 2 + undefined == NaN
  • λ§€κ°œλ³€μˆ˜λ³΄λ‹€ μΈμˆ˜κ°€ 더 λ§Žμ€ 경우 초과된 μΈμˆ˜λŠ” λ¬΄μ‹œλœλ‹€.
  • λͺ¨λ“  μΈμˆ˜λŠ” μ•”λ¬΅μ μœΌλ‘œ arguments 객체의 ν”„λ‘œνΌν‹°λ‘œ λ³΄κ΄€λœλ‹€.
function sum() { let result = 0; for (let i = 0; i < arguments.length; i++) { result += arguments[i]; } return result; } console.log(sum()); // 0 console.log(sum(1)); // 1 console.log(sum(1, 2)); // 3 console.log(sum(1, 2, 3)); // 6

arguments 객체λ₯Ό ν™œμš©ν•œ κ°€λ³€ 인자 ν•¨μˆ˜ μ˜ˆμ‹œ

function sum(...args) { return args.reduce((pre, cur) => pre + cur, 0); } console.log(sum()); // 0 console.log(sum(1)); // 1 console.log(sum(1, 2)); // 3 console.log(sum(1, 2, 3)); // 6

보톡 Rest νŒŒλΌλ―Έν„°λ₯Ό μ΄μš©ν•΄ μ΄λŸ°μ‹μœΌλ‘œ κ΅¬ν˜„ν•˜λŠ” κ²½μš°κ°€ 더 λ§Žμ•˜λ˜ 것 κ°™λ‹€.

12.5.2 인수 확인

function add(x, y) { return x + y; } console.log(add(2)); // NaN console.log(add("a", "b")); // 'ab'
Note
  1. μžλ°”μŠ€ν¬λ¦½νŠΈ ν•¨μˆ˜λŠ” λ§€κ°œλ³€μˆ˜μ™€ 인수의 κ°œμˆ˜κ°€ μΌμΉ˜ν•˜λŠ”μ§€ ν™•μΈν•˜μ§€ μ•ŠλŠ”λ‹€.
  2. μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 동적 νƒ€μž… μ–Έμ–΄λ‹€. λ”°λΌμ„œ μžλ°”μŠ€ν¬λ¦½νŠΈ ν•¨μˆ˜λŠ” λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…μ„ 사전에 지정할 수 μ—†λ‹€.
  • νƒ€μž… 검사 λ˜λŠ” 인수 개수 ν™•μΈν•˜λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•˜κ±°λ‚˜ λ§€κ°œλ³€μˆ˜ 기본값을 톡해 쑰금 더 μ•ˆμ „ν•œ μ½”λ“œ μž‘μ„± κ°€λŠ₯
  • νƒ€μž…μŠ€ν¬λ¦½νŠΈλ₯Ό λ„μž…ν•΄ 컴파일 μ‹œμ μ— λΆ€μ μ ˆν•œ 호좜 λ°©μ§€ν•˜λŠ” 방법도 μžˆλ‹€.

12.5.3 λ§€κ°œλ³€μˆ˜μ˜ μ΅œλŒ€ 개수

  • ECMAScript μ‚¬μ–‘μ—μ„œλŠ” λ§€κ°œλ³€μˆ˜μ˜ μ΅œλŒ€ κ°œμˆ˜μ— λŒ€ν•΄ λͺ…μ‹œμ μœΌλ‘œ μ œν•œν•˜κ³  μžˆμ§€ μ•Šλ‹€.
  • λ§€κ°œλ³€μˆ˜μ˜ κ°œμˆ˜λŠ” μ μ„μˆ˜λ‘ μ’‹μœΌλ©°, λ§€κ°œλ³€μˆ˜μ˜ 개수λ₯Ό 쀄여 ν•¨μˆ˜κ°€ ν•œ 가지 일만 ν•˜κ²Œ λ§Œλ“€μ–΄μ•Όν•œλ‹€.
$.ajax({ method: "POST", url: "/user", data: { id: 1, name: "Lee" }, cache: false, });
  • 3개 μ΄μƒμ˜ λ§€κ°œλ³€μˆ˜κ°€ ν•„μš”ν•˜λ©΄ ν•˜λ‚˜μ˜ λ§€κ°œλ³€μˆ˜λ₯Ό μ„ μ–Έν•˜κ³  객체λ₯Ό 인수둜 μ „λ‹¬ν•˜λŠ” 것이 μœ λ¦¬ν•˜λ‹€.

12.5.4 λ°˜ν™˜λ¬Έ

  • ν•¨μˆ˜λŠ” return ν‚€μ›Œλ“œμ™€ ν‘œν˜„μ‹(λ°˜ν™˜κ°’) 으둜 이뀄진 λ°˜ν™˜λ¬Έμ„ μ‚¬μš©ν•΄ μ‹€ν–‰ κ²°κ³Όλ₯Ό ν•¨μˆ˜ μ™ΈλΆ€λ‘œ λ°˜ν™˜(return)ν•  수 μžˆλ‹€.
var result = multiply(3, 5);
  • ν•¨μˆ˜ ν˜ΈμΆœμ€ ν‘œν˜„μ‹μ΄λ‹€.

    [!note] > λ°˜ν™˜λ¬Έμ˜ 두 가지 μ—­ν• 

    1. ν•¨μˆ˜ μ‹€ν–‰ 쀑단
    2. ν‘œν˜„μ‹ 평가 ν›„ λ°˜ν™˜
  • λ°˜ν™˜λ¬Έμ„ μƒλž΅ν•˜λ©΄ ν•¨μˆ˜λŠ” μ•”λ¬΅μ μœΌλ‘œ undefinedλ₯Ό λ°˜ν™˜ν•œλ‹€.

12.6 참쑰에 μ˜ν•œ 전달과 μ™ΈλΆ€ μƒνƒœμ˜ λ³€κ²½

// λ§€κ°œλ³€μˆ˜ primitiveλŠ” μ›μ‹œκ°’μ„ 전달받고, λ§€κ°œλ³€μˆ˜ objλŠ” 객체λ₯Ό μ „λ‹¬λ°›λŠ”λ‹€. function changeVal(primitive, obj) { primitive += 100; obj.name = "Kim"; } // μ™ΈλΆ€ μƒνƒœ var num = 100; var person = { name: "Lee" }; console.log(num); // 100 console.log(person); // {name: "Lee"} // μ›μ‹œκ°’μ€ κ°’ μžμ²΄κ°€ λ³΅μ‚¬λ˜μ–΄ μ „λ‹¬λ˜κ³  κ°μ²΄λŠ” 참쑰값이 λ³΅μ‚¬λ˜μ–΄ μ „λ‹¬λœλ‹€. changeVal(num, person); // μ›μ‹œκ°’μ€ 원본이 ν›Όμ†λ˜μ§€ μ•ŠλŠ”λ‹€. console.log(num); // 100 // κ°μ²΄λŠ” 원본이 ν›Όμ†λœλ‹€. console.log(person); // {name: "Kim"}
  • μ›μ‹œ νƒ€μž… μΈμˆ˜λŠ” κ°’ μžμ²΄κ°€ λ³΅μ‚¬λ˜μ–΄ λ§€κ°œλ³€μˆ˜μ— μ „λ‹¬λ˜κΈ° λ•Œλ¬Έμ— ν•¨μˆ˜ λͺΈμ²΄μ—μ„œ κ·Έ 값을 λ³€κ²½(μž¬ν• λ‹Ήμ„ ν†΅ν•œ ꡐ체)해도 원본은 ν›Όμ†λ˜μ§€ μ•ŠλŠ”λ‹€.
  • 객체 νƒ€μž… μΈμˆ˜λŠ” μ°Έμ‘° 값이 λ³΅μ‚¬λ˜μ–΄ λ§€κ°œλ³€μˆ˜μ— μ „λ‹¬λ˜κΈ° λ•Œλ¬Έμ— ν•¨μˆ˜ λͺΈμ²΄μ—μ„œ μ°Έμ‘° 값을 톡해 객체λ₯Ό λ³€κ²½ν•  경우 원본이 ν›Όμ†λœλ‹€.
  • ν•¨μˆ˜κ°€ μ™ΈλΆ€ μƒνƒœλ₯Ό λ³€κ²½ν•˜λ©΄ μƒνƒœ λ³€ν™”λ₯Ό μΆ”μ ν•˜κΈ° μ–΄λ €μ›Œμ§„λ‹€.
  • 객체의 변경을 μΆ”μ ν•˜λ €λ©΄ μ˜΅μ €λ²„ νŒ¨ν„΄ 등을 이용
  • λ˜λŠ” 객체λ₯Ό λΆˆλ³€ 객체둜 λ§Œλ“€μ–΄ 이용
Note
  • μ™ΈλΆ€ μƒνƒœλ₯Ό λ³€κ²½ν•˜μ§€ μ•Šκ³  μ™ΈλΆ€ μƒνƒœμ— μ˜μ‘΄ν•˜μ§€λ„ μ•ŠλŠ” ν•¨μˆ˜λ₯Ό 순수 ν•¨μˆ˜λΌ ν•œλ‹€.
  • 순수 ν•¨μˆ˜λ₯Ό 톡해 ν”„λ‘œκ·Έλž¨μ˜ μ•ˆμ •μ„±μ„ λ†’μ΄λ €λŠ” ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μ„ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ΄λΌ ν•œλ‹€.

12.7 λ‹€μ–‘ν•œ ν•¨μˆ˜μ˜ ν˜•νƒœ

12.7.1 μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜

// 읡λͺ… μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜ (function () { var a = 3; var b = 5; return a * b; })();
  • ν•¨μˆ˜ μ •μ˜μ™€ λ™μ‹œμ— μ¦‰μ‹œ 호좜되고 λ‹€μ‹œ ν˜ΈμΆœν•  수 μ—†λŠ” ν•¨μˆ˜λ₯Ό μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λΌ ν•œλ‹€.
  • μ˜›λ‚ μ—” μ „μ—­ μŠ€μ½”ν”„ μ˜€μ—Ό 방지, 데이터 μΊ‘μŠν™” λ“±λ“± λ•Œλ¬Έμ— μ’…μ’… μΌμ§€λ§Œ ES6 μ΄ν›„λ‘œλŠ” 잘 μ•ˆμ“΄λ‹€.

12.7.2 μž¬κ·€ ν•¨μˆ˜

function countdown(n) { if (n < 0) return; console.log(n); countdown(n - 1); // μž¬κ·€ 호좜 }
  • 반볡 처리λ₯Ό μœ„ν•΄ ν•¨μˆ˜κ°€ 자기 μžμ‹ μ„ ν˜ΈμΆœν•˜λŠ” ν•¨μˆ˜λ₯Ό μž¬κ·€ ν•¨μˆ˜λΌ ν•œλ‹€.
// ν•¨μˆ˜ ν‘œν˜„μ‹ var factorial = function foo(n) { // νƒˆμΆœ 쑰건: n이 1 μ΄ν•˜μΌ λ•Œ μž¬κ·€ ν˜ΈμΆœμ„ λ©ˆμΆ˜λ‹€. if (n <= 1) return 1; // ν•¨μˆ˜λ₯Ό κ°€λ¦¬ν‚€λŠ” μ‹λ³„μžλ‘œ 자기 μžμ‹ μ„ μž¬κ·€ 호좜 return n * factorial(n - 1); // ν•¨μˆ˜ μ΄λ¦„μœΌλ‘œ 자기 μžμ‹ μ„ μž¬κ·€ ν˜ΈμΆœν•  μˆ˜λ„ μžˆλ‹€. // console.log(factorial === foo); // true // return n * foo(n - 1); };
  • ν•¨μˆ˜ λͺΈμ²΄ λ‚΄λΆ€μ—μ„œλŠ” ν•¨μˆ˜ μ΄λ¦„μœΌλ‘œλ„ 자기 μžμ‹ μ„ μž¬κ·€ ν˜ΈμΆœν•  μˆ˜λ„ μžˆλ‹€.
  • μž¬κ·€ ν•¨μˆ˜ λ‚΄μ—λŠ” νƒˆμΆœ 쑰건을 λ°˜λ“œμ‹œ λ§Œλ“€μ–΄μ•Όν•œλ‹€.

12.7.3 쀑첩 ν•¨μˆ˜

function outer() { var x = 1; // 쀑첩 ν•¨μˆ˜ function inner() { var y = 2; // μ™ΈλΆ€ ν•¨μˆ˜μ˜ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μžˆλ‹€. console.log(x + y); // 3 } inner(); } outer();
  • ν•¨μˆ˜ 내뢀에 μ •μ˜λœ ν•¨μˆ˜λ₯Ό 쀑첩 ν•¨μˆ˜ λ˜λŠ” λ‚΄λΆ€ ν•¨μˆ˜λΌ ν•œλ‹€.
  • 쀑첩 ν•¨μˆ˜λ₯Ό ν¬ν•¨ν•˜λŠ” ν•¨μˆ˜λŠ” μ™ΈλΆ€ ν•¨μˆ˜λΌ λΆ€λ₯Έλ‹€.

[!note] ES6λΆ€ν„°λŠ” ν•¨μˆ˜ 선언문을 ifλ¬Έμ΄λ‚˜Β forλ¬Έ λ“±μ˜ μ½”λ“œ 블둝 λ‚΄μ—μ„œλ„ μ •μ˜ν•  수 μžˆλ‹€.
단, ν˜Έμ΄μŠ€νŒ…μœΌλ‘œ 인해 ν˜Όλž€μ΄ λ°œμƒν•  수 μžˆμœΌλ―€λ‘œ λ°”λžŒμ§ν•˜μ§€ μ•Šλ‹€.
쀑첩 ν•¨μˆ˜λŠ”Β ν΄λ‘œμ €μ™€ 관련이 μžˆλ‹€.

12.7.4 콜백 ν•¨μˆ˜

repeat(5, function (i) { if (i % 2) console.log(i); }); // 1 3
  • ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜λ₯Ό 톡해 λ‹€λ₯Έ ν•¨μˆ˜μ˜ λ‚΄λΆ€λ‘œ μ „λ‹¬λ˜λŠ” ν•¨μˆ˜λ₯Ό 콜백 ν•¨μˆ˜λΌκ³  ν•œλ‹€.
  • 맀개 λ³€μˆ˜λ₯Ό 톡해 ν•¨μˆ˜μ˜ μ™ΈλΆ€μ—μ„œ 콜백 ν•¨μˆ˜λ₯Ό 전달받은 ν•¨μˆ˜λ₯Ό κ³ μ°¨ ν•¨μˆ˜λΌκ³  ν•œλ‹€.
  • κ³ μ°¨ ν•¨μˆ˜λŠ” λ§€κ°œλ³€μˆ˜λ₯Ό 톡해 전달받은 콜백 ν•¨μˆ˜μ˜ 호좜 μ‹œμ μ„ κ²°μ •ν•΄μ„œ ν˜ΈμΆœν•œλ‹€.
  • μ½œλ°±ν•¨μˆ˜λŠ” ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„ 뿐만 μ•„λ‹ˆλΌ λΉ„λ™κΈ°μ²˜λ¦¬(이벀트 처리, Ajax 톡신, 타이머 ν•¨μˆ˜ λ“±) 에 ν™œμš©λ˜λŠ” μ€‘μš”ν•œ νŒ¨ν„΄μ΄λ‹€.

12.7.5 순수 ν•¨μˆ˜μ™€ λΉ„μˆœμˆ˜ ν•¨μˆ˜

  • μ–΄λ–€ μ™ΈλΆ€ μƒνƒœμ— μ˜μ‘΄ν•˜μ§€λ„ μ•Šκ³  λ³€κ²½ν•˜μ§€λ„ μ•ŠλŠ” ν•¨μˆ˜λ₯Ό 순수 ν•¨μˆ˜λΌκ³  ν•œλ‹€.
  • μ™ΈλΆ€ μƒνƒœμ— μ˜μ‘΄ν•˜κ±°λ‚˜ μ™ΈλΆ€ μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ” ν•¨μˆ˜λ₯Ό λΉ„μˆœμˆ˜ ν•¨μˆ˜λΌκ³  ν•œλ‹€.
  • 순수 ν•¨μˆ˜λŠ” λ™μΌν•œ μΈμˆ˜κ°€ μ „λ‹¬λ˜λ©΄ μ–Έμ œλ‚˜ λ™μΌν•œ 값을 λ°˜ν™˜ν•œλ‹€.

    [!note] > ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ€ 순수 ν•¨μˆ˜μ™€ 보쑰 ν•¨μˆ˜μ˜ 쑰합을 톡해 μ™ΈλΆ€ μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ” λΆ€μˆ˜ 효과λ₯Ό μ΅œκ³ ν™”ν•΄μ„œ λΆˆλ³€μ„±μ„ 지ν–₯ν•˜λŠ” ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μ΄λ‹€.

Last updated on